#include "baseutil.h"
#include <math.h>

#include "StreamLog.h"
#include "String.h"

using namespace std;

namespace yet {
string trim(string s) {
	if(s.empty()){
		return "";
	}
	string r;
	int a = 0;
	for (size_t i = 0; i < s.size(); ++i) {
		if(isspace(s[i])) {
			++a;
		}else{
			break;
		}
	}
	int b = 0;
	for (int i = s.size() -1; i >= a; --i) {
		if (isspace(s[i])) {
			++b;
		}else{
			break;
		}
	}
	return s.substr(a, s.size() -a - b);
}

vector<string> split(const string& s, char ch) {
	vector<string> vec;
	int from = -1;
	int cur = 0;
	for (size_t i = 0; i < s.size(); ++i) {
		if (s[i] == ch) {
			cur = i;
			from++;
			vec.push_back(s.substr(from, cur - from));
			from = cur;
		}
	}
	if (cur < s.size()) {
		vec.push_back(s.substr(cur + 1));
	}
	return vec;
}

StreamLog& operator <<(StreamLog& slog, const String& s) {
	slog.append(string(s.buffer(), s.length()));
	return slog;
}

WithTag::WithTag() :
		tag(0) {

}
void WithTag::setTag(int tag_) {
	tag = tag_;
}
int WithTag::getTag() {
	return tag;
}

//return value > 0 if found;
//else ~value is the insert pos.
int binarySearch(const int* a, int start, int len, int key) {
	int high = start + len, low = start - 1, guess;

	while (high - low > 1) {
		guess = (high + low) / 2;

		if (a[guess] < key)
			low = guess;
		else
			high = guess;
	}

	if (high == start + len)
		return ~(start + len);
	else if (a[high] == key)
		return high;
	else
		return ~high;
}

bool inSet(int val, int a1) {
	return val == a1;
}
bool inSet(int val, int a1, int a2) {
	return val == a1 || val == a2;
}
bool inSet(int val, int a1, int a2, int a3) {
	return val == a1 || val == a2 || val == a3;
}
bool inSet(int val, int a1, int a2, int a3, int a4) {
	return val == a1 || val == a2 || val == a3 || val == a4;
}
bool inSet(int val, int a1, int a2, int a3, int a4, int a5) {
	return val == a1 || val == a2 || val == a3 || val == a4 || val == a5;
}
bool inSet(int val, int a1, int a2, int a3, int a4, int a5, int a6) {
	return val == a1 || val == a2 || val == a3 || val == a4 || val == a5 || val == a6;
}
bool inSet(int val, int a1, int a2, int a3, int a4, int a5, int a6, int a7) {
	return val == a1 || val == a2 || val == a3 || val == a4 || val == a5 || val == a6 || val == a7;
}
bool inSet(int val, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8) {
	return val == a1 || val == a2 || val == a3 || val == a4 || val == a5 || val == a6 || val == a7 || val == a8;
}
bool inSet(int val, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9) {
	return val == a1 || val == a2 || val == a3 || val == a4 || val == a5 || val == a6 || val == a7 || val == a8
			|| val == a9;
}
bool inSet(int val, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9, int a10) {
	return val == a1 || val == a2 || val == a3 || val == a4 || val == a5 || val == a6 || val == a7 || val == a8
			|| val == a9 || val == a10;
}

}
